package solution;

import java.util.HashMap;
import java.util.Map;

/*
* 1 Array
* 单纯使用使用数组
* 返回一定不为空
*
*
* 在循环过程中得到答案后应该直接返回。
* 保证代码健壮
*
* 1.暴力循环
* 2.哈希表
* */
public class TwoSum {

    /*
    *
    * 使用双指针法
    * 数组没有排序，使用失败。测试用例[3,2,4] 6；
    * 因为需要返回原本的数组index所有不能使用
    * */
    public static int[] solution1(int[] nums, int target){
        int pointA = 0;
        int pointB = nums.length - 1;
        while (target != (nums[pointA] + nums[pointB])){
            if (nums[pointA] + nums[pointB] < target){
                if (nums[pointA] >= nums[pointB]){
                    pointB--;
                }else {
                    pointA++;
                }
            }else {
                if (nums[pointA] >= nums[pointB]){
                    pointA++;
                }else {
                    pointB--;
                }
            }
        }
        return new int[]{pointA, pointB};
    }

    /*
    * 暴力求解
    * 通过寻找pointB，使得num[pointB] = num[pointA] - target
    * */
    public static int[] sulution2(int[] nums, int target){
//        int pointA = 0;
//        int pointB;
//        for (; pointA < nums.length; pointA++){
//            for (pointB = pointA + 1; pointB < nums.length; pointB++){
//                if ((nums[pointA] + nums[pointB]) == target){
//                    return new int[]{pointA, pointB};
//                }
//            }
//        }
//        return new int[0];

        //循环过程将i < nums.length - 2;测试[1,2]不通过
//        int[] result = new int[2];
//        if (nums != null && nums.length >= 2){
//            for (int i = 0 ; i < nums.length - 2 ; i++){
//                for (int j = i + 1 ; j < nums.length - 1 ; i++){
//                    if (nums[i] + nums[j] == target){
//                        result[0] = i;
//                        result[1] = j;
//                        return result;
//                    }
//                }
//            }
//        }
//
//
//        return result;

        //保证代码健壮。优化代码阅读
//        if (nums != null && nums.length > 1){
//            for (int i = 0 ; i < nums.length ; i++){
//                for (int j = i + 1 ; j < nums.length ; j++){
//                    if (nums[i] + nums[j] == target){
//                        return new int[]{i, j};
//                    }
//                }
//            }
//        }
//
//
//        return new int[2];

        //减少一次i循环
        //注意数组的初始化
        if (nums != null && nums.length > 1){
            for (int i = 0 ; i < nums.length - 1 ; i++){
                for (int j = i + 1 ; j < nums.length ; j ++){
                    if (nums[i] + nums[j] == target){
                        return new int[]{i,j};
                    }
                }
            }
        }

        return new int[2];
    }

    /*
    * 使用哈希表
    *
    * */
    public static int[] sulution3(int[] nums, int target){
//        Map<Integer, Integer> hashmap = new HashMap<>();
//        for (int i = 0; i < nums.length; i++){
//            if (hashmap.containsKey(target - nums[i])){
//                return new int[]{i, hashmap.get(target - nums[i])};
//            }
//            hashmap.put(nums[i],i);
//        }
//        return new int[0];

        //保证代码健壮
        if (nums != null && nums.length > 1){
            Map<Integer, Integer> map = new HashMap<>();

            for (int i = 0 ; i < nums.length ; i++){
                if (map.containsKey(target - nums[i])){
                    return new int[]{i, map.get(target - nums[i])};
                }

                map.put(nums[i], i);
            }
        }

        return new int[2];
    }
}
